﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Resources;

using ID = System.String;
using Value = System.String;

namespace ResxusEngine
{
    public class Reader
    {
        /// <summary>
        /// RC 파일을 읽어 해쉬 리스트에 채웁니다.
        /// </summary>
        /// <param name="outputs">해쉬 리스트</param>
        /// <param name="resxFilePath">리소스 파일경로</param>
        public static void Fill(IDictionary<ID, Value> outputs, string resxFilePath)
        {
            using (ResXResourceReader reader = new ResXResourceReader(resxFilePath))
            {
                IDictionaryEnumerator enums = GetEnumerator(reader);
                while (enums.MoveNext())
                {
                    ID currentKey = enums.Key.ToString();
                    Value currentValue = enums.Value.ToString();

                    outputs.Add(currentKey, currentValue);
                }
            }
        }

        /// <summary>
        /// 사전자료구조에서 반복자를 추출합니다. 
        /// </summary>
        /// <param name="reader">리소스 리더</param>
        /// <returns>반복자</returns>
        public static IDictionaryEnumerator GetEnumerator(ResXResourceReader reader)
        {
            IDictionaryEnumerator en = reader.GetEnumerator();
            return en;
        }

        /// <summary>
        /// RC 파일을 읽어 해쉬 리스트에 채웁니다. 
        /// </summary>
        /// <param name="outputs">해쉬 리스트</param>
        /// <param name="resxFilePath">리소스 파일 경로</param>
        /// <param name="FillAction">각 값에 적용되는 특정 액션</param>
        public static void Fill(IDictionary<string, Values> outputs, string resxFilePath, Func<string, Values> fillAction)
        {
            using (ResXResourceReader reader = new ResXResourceReader(resxFilePath))
            {
                IDictionaryEnumerator enums = GetEnumerator(reader);
                Fill(outputs, enums, fillAction);
            }
        }
        
        /// <summary>
        /// RC 파일을 읽어 해쉬 리스트에 채웁니다.
        /// </summary>
        /// <param name="outputList">해쉬 리스트</param>
        /// <param name="listEnum"></param>
        /// <param name="job">각 값에 적용되는 특정 액션</param>
        public static void Fill(IDictionary<ID, Values> outputs, IDictionaryEnumerator resxEnumerator, Func<ID, Values> fillAction)
        {
            while (resxEnumerator.MoveNext())
            {
                ID currentKey = resxEnumerator.Key.ToString();
                Value currentValue = resxEnumerator.Value.ToString();
                if (outputs.Keys.Contains(currentKey) == false)
                {
                    Values newEntryValue = fillAction(currentValue);
                    outputs.Add(currentKey, newEntryValue);
                }
                else
                {
                    Values newValues = fillAction(currentValue);
                    outputs[currentKey] = outputs[currentKey].Merge(newValues);
                }
            }
        }
    }
}
